// 1899. [模拟]手机壳库存管理  https://oj.rnd.huawei.com/problems/1899/details
// 不能用map,可以用priority_queue,含重复值
//库存管理对于手机壳销售是否达成盈利最大化至关重要。
//仓库中有一批不同型号的手机壳，每种型号手机壳的库存数量存在数组inventory中、总售价存在数组price中
//每种型号手机壳的 销售收益 = 销售数量 * (price[i] / inventory[i])
//现给定市场上手机壳的最大需求量demand，请制定最佳销售策略以获得最大的总销售收益，并返回该值。
// M 手机壳种类的个数，取值范围：[1, 1000]； N
// 市场最大需求量，范围[1,500]单位为千部。 输入 首行两个正整数 M 和 N， 第2行 M
//个数字，表示每种型号手机壳的数量（单位为千部），每个数字的取值范围：(0.0,1000.0]
//第3行 M
//个数字，表示每种手机壳的总售价单位为万元，顺序与第2行一一对应，取值范围：(0.0,10000.0]
//输出 浮点数形式的最大收益值万元为单位
//系统进行浮点数结果判断，误差在0.01之内即认为正确。
//输入 3 20
// 18 15.0 10     数量
// 75.0 72 45     售价
//输出 94.50
//最大收益策略是卖出全部 15 千部第 2 种型号手机壳、以及 5 千部第 3 种型号，获得
// 72 + 45/2 = 94.5万元

#include <algorithm>
#include <iostream>
#include <map>
#include <queue>
#include <utility>
#include <vector>
using namespace std;

struct PhoneSell {
  float price = 0.f;
  float count = 0.f;
  float profit = 0.f;
  bool operator<(const PhoneSell &ps) const {  // queue.less{3,2,1}
    if (abs(profit - ps.profit) < 1e-6) return count > ps.count;
    return profit < ps.profit;
  }
};
class Solution {
 public:
  // vector 方法
  float PhoneSellManage0(float demand, const vector<float> &inventory,
                         const vector<float> &price) {
    vector<PhoneSell> vtSell(inventory.size());
    for (int i = 0; i < inventory.size(); i++) {
      if (inventory[i] < 1e-6) {
        continue;
      }
      vtSell[i] = {price[i], inventory[i], price[i] / inventory[i]};
    }
    std::sort(vtSell.begin(), vtSell.end(),
              [](PhoneSell p1, PhoneSell p2) { return p1.profit > p2.profit; });
    float salesSam = 0;
    for (auto [price, cnt, profit] : vtSell) {
      if (demand > cnt) {
        salesSam += (cnt * profit);
        demand -= cnt;
      } else {
        salesSam += (demand * profit);
        break;
      }
    }
    return salesSam;
  }
  // priority_queue方法
  float PhoneSellManage2(float demand, const vector<float> &inventory,
                         const vector<float> &price) {
    for (size_t i = 0; i < inventory.size(); i++) {
      if (inventory[i] < 1e-6) {
        continue;
      }
      quBenifit_.push({price[i], inventory[i],
                       price[i] / inventory[i]});  // = price[i]/inventory[i];
    }
    //        for (auto [pSell, pf] : quBenifit_) {
    //            auto [price, cnt, profit] = pSell;
    //            printf("%f, %f, %f = %f\n", price, cnt, profit, pf);
    //        }
    float salesSam = 0;
    while (!quBenifit_.empty()) {
      auto [price, cnt, pf] = quBenifit_.top();
      quBenifit_.pop();
      if (demand >= cnt) {
        salesSam += (pf * cnt);
        // printf("%f, %f, %f = %f\n", salesSam, demand, pf);
        demand -= cnt;
      } else {
        salesSam += (pf * demand);
        // printf("%f, %f, %f = %f\n", salesSam, demand, pf);
        break;
      }
    }
    return salesSam;
  }

 private:
  //    map<PhoneSell, float, greater<PhoneSell> > mapBenifit_;    错误含重复键
  priority_queue<PhoneSell, vector<PhoneSell>, less<PhoneSell> > quBenifit_;
};
// =============
inline int ReadInt() {
  int number;
  std::cin >> number;
  return number;
}
template <typename T>
inline std::vector<T> ReadVector(int size) {
  std::vector<T> objects(size);
  for (int i = 0; i < size; ++i) {
    std::cin >> objects[i];
  }
  return objects;
}
int main() {
  int num;
  float demand;
  cin >> num >> demand;
  vector<float> inventory = ReadVector<float>(num);
  vector<float> price = ReadVector<float>(num);
  Solution solu;
  float result = solu.PhoneSellManage2(demand, inventory, price);
  cout << result;
  return 0;
}
